using System;
using System.Collections.Generic;
using System.Text;
using DataAccessTecnoPez;

namespace BussinessLogicTecnoPez.Produccion.Compras
{
    [Serializable]
    [DBTable("stockInsumo")]
    public class StockInsumos : EntityBase<StockInsumos>
    {

        private int idStock;

        [DBField("idStock", true, true)]
        public int IdStock
        {
            get { return idStock; }
            set { idStock = value; }
        }

        private DateTime fecha;

        [DBField("fecha", false, false)]
        public DateTime Fecha
        {
            get { return fecha; }
            set { fecha = value; }
        }

        private decimal cantidadMov;

        [DBField("cantidadMov", false, false)]
        public decimal CantidadMov
        {
            get { return cantidadMov; }
            set { cantidadMov = value; }
        }

        private decimal cantidadTotal;

        [DBField("cantidadTotal", false, false)]
        public decimal CantidadTotal
        {
            get { return cantidadTotal; }
            set { cantidadTotal = value; }
        }

        private Insumo insumo;

        [DBField("idInsumo", false, false, true, "idInsumo")]
        public Insumo Insumo
        {
            get { return insumo; }
            set { insumo = value; }
        }

        private PedidoProveedor pedidoProveedor;

        [DBField("idPedidoProveedor", false, false, true, "idPedidoProveedor")]
        public PedidoProveedor PedidoProveedor
        {
            get { return pedidoProveedor; }
            set { pedidoProveedor = value; }
        }


        private Alimentacion.ItemCronogramaAlimentacion cronogramaDeAlimentacion;

        [DBField("idCronogramaAlimentacion", false, false, true, "idCronogramaAlimentacion")]
        public Alimentacion.ItemCronogramaAlimentacion CronogramaDeAlimentacion
        {
            get { return cronogramaDeAlimentacion; }
            set { cronogramaDeAlimentacion = value; }
        }

        /// <summary>
        /// Metodo que dado un insumo devuelve su ultimo movimiento.
        /// 
        /// </summary>
        /// <param name="parametro"></param>
        /// <returns></returns>
        public static StockInsumos obtenerUltimoEstadoDeStock(Insumo parametro)
        {

            using (SQL cnn = new SQL())
            {
                cnn.SqlString = "SELECT     TOP (1) idStock " +
                                "   FROM         stockInsumo" +
                                " WHERE     (idInsumo = ?)" +
                                " ORDER BY fecha DESC ";
                System.Data.OleDb.OleDbDataReader dr;
                dr = cnn.GetDataReader(parametro.IdInsumo);
                if (dr.Read())
                {
                    return StockInsumos.getManager.GetOneByPrimaryKey(dr.GetInt32(0));
                }
                else
                {
                    return null;
                }
            }
        }

        /// <summary>
        /// Metodo para generar en memoria movimientos de stock
        /// por entradas de pedidos.
        /// </summary>
        /// <param name="insumoEntrante"></param>
        /// <param name="movimiento"></param>
        /// <param name="fechaMovimiento"></param>
        /// <param name="idPedidoProveedor"></param>
        /// <returns></returns>
        public static StockInsumos incorporarStockDesdePedido(Insumo insumoEntrante, decimal movimiento, DateTime fechaMovimiento, int idPedidoProveedor)
        {
            StockInsumos result = new StockInsumos();

            using (SQL cnn = new SQL())
            {
                cnn.SqlString = "SELECT     TOP (1) cantidadTotal " +
                                "   FROM         stockInsumo" +
                                " WHERE     (idInsumo = ?)" +
                                " ORDER BY fecha DESC ";
                System.Data.OleDb.OleDbDataReader dr;
                dr = cnn.GetDataReader(insumoEntrante.IdInsumo);
                if (dr.Read())
                {
                    result.CantidadTotal = dr.GetDecimal(0);
                }
                else
                {
                    result.CantidadTotal = 0;
                }
                dr.Close();
                result.insumo = insumoEntrante;
                result.cantidadMov = movimiento;
                result.CantidadTotal += movimiento;
                result.fecha = fechaMovimiento;
                PedidoProveedor p = PedidoProveedor.getManager.GetOneByPrimaryKey(idPedidoProveedor);
                result.pedidoProveedor = p;
            }

            return result;

        }
    }
}